/**
 * \file packet_utils.h
 * \brief Header des utilitaires pour les paquets
 * \author Pierre Neumann / Julien Meutelet
 * \version 0.1
 * \date 20 decembre 2013
 *
 * Fichier header de packet_utils.c
 *
 */
#include <netinet/in.h>
#ifndef packet_utils_h
#define packet_utils_h

/**
 * \struct pseudo_header
 * \brief Pseudo-header
 *
 * Pseudo-header pour le calcul des checksum pour TCP et UDP.
 * 
 */
struct pseudo_header{
	u_int32_t source_address;
	u_int32_t dest_address;
	u_int8_t placeholder;
	u_int8_t protocol;
	u_int16_t length;
};

/**
 * \struct ping_result
 * \brief Résultat du ping
 *
 * Structure représentant le résultat d'un ping.
 * 
 */
struct ping_result{
	struct in_addr addr;
	int port;
	int type;
	long int time;
	int size;
	int protocol;
	int ttl;
};

/**
 * \fn checksum(unsigned short *addr, int length)
 * \brief Calcule la checksum. Référence : RFC 1071 
 *
 * \param addr Pointeur vers l'adresse de départ du calcul de la checksum.
 * \param length Longueur des données à calculer.
 * \return unsigned short Checksum.
 */
unsigned short checksum(unsigned short *addr, int len);

/**
 * \fn checksum_with_pseudoheader(char** packet,size_t protocol_header_size)
 * \brief Calcul de checksum avec pseudo-header pour TCP et UDP
 *
 * \param packet Chaine de caractère représentant le paquet UDP/TCP.
 * \param protocol_header_size Taille de l'entête du protocol + taille des données.
 * \return unsigned short Checksum.
 */
unsigned short checksum_with_pseudoheader(char** packet,size_t protocol_header_size);

/**
 * \fn get_my_ip(void)
 * \brief Renvoie l'adresse IP de la machine
 *
 * \return Structure in_addr contenant l'adresse IP de la machine.
 */
struct in_addr get_my_ip(void);

/**
 * \fn init_ping_result(struct ping_result *res,char** packet,int size,long int time)
 * \brief Initialise un résultat de ping
 *
 * \param res Pointeur vers une structure ping_result.
 * \param packet Chaine de caractère représentant le paquet.
 * \param size Taille des données récupérées lors du receivefrom.
 * \param time Temps d'allez-retour en micro-secondes.
 * \return Rien.
 */
void init_ping_result(struct ping_result *res,char** packet,int size,long int time);

/**
 * \fn print_packet(char** packet, int length)
 * \brief Affiche en hexadecimal le paquet
 *
 * \param packet Chaine de caractère représentant le paquet.
 * \param length Taille du paquet.
 * \return Rien.
 */
void print_packet(char** packet, int length);

/**
 * \fn print_details(char** packet)
 * \brief Affiche en détail le contenu du paquet
 *
 * \param packet Chaine de caractère représentant le paquet.
 * \return Rien.
 */
void print_details(char** packet);

/**
 * \fn print_ping_result(struct ping_result *res)
 * \brief Affiche le résultat du ping
 *
 * \param res Pointeur vers une structure ping_result.
 * \return Rien.
 */
void print_ping_result(struct ping_result *res);

#endif
